<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    var a = b = { a: 1 };
    // Object
    // Object.length: 值为1
    // Object.prototype: 可以为所有的Object类型的对象添加属性
    // Object构造函数的静态方法
    // // Object.assign：对象合并，如果出现重复的key，位置用第一个参数。value被第二个参数覆盖
    // const obj = Object.assign({ a: 1, c: 2 }, { b: 2, c: 3 })
    // console.log(obj) // {a: 1, c: 3, b: 2}

    // // Object.create 创建一个对象

    // Object.defineProperty()：给对象的添加属性并设置属性描述{ value, writable, configurable, enumerable, get, set}
    // Object.defineProperties()：同上，不过是给对象已有的全部属性添加

    // Object.entries() 返回给定对象 自身 可枚举属性的[ key, value ]数组
    // console.log(Object.entries({a:1, b: 2})) // [['a', 1], ['b', 2]]

    // Object.freeze() 冻结一个对象：任何信息（添加、删除、修改值、修改描述、原型）都是不能被修改的

    // Object.getOwnPropertyDescriptor(obj, 'a')// 返回对象上一个 自有 属性的描述符

    // Object.getOwnPropertyNames() // 返回一个对象的所有 自身 属性（包括不可枚举的属性，但我包括以Symbol值作为名称的属性）组成数组

    // Object.getOwnPropertySymbols() // 在对象 自身 找到的所有Symbol属性组成的数组

    // Object.getPrototypeOf() // 返回对象其原型的对象

    // var a = b = { a: 1 }
    // console.log(Object.is(a, b)) // 比较两个是否相等（比的是指针，不是堆中的内容）

    // Object.isExtensible() // 返回一个对象是否是可扩展的（是否能添加新的属性）Boolean
    // Object.freeze(a)
    // console.log(Object.isExtensible(a))

    // Object.isSealed() //检查一个对象是否被密封（不可扩展、自身属性不可配置，不可删除。但不一定是可写）如果被密封切所有属性不可写，那就等于是冻结了

    // Object.keys() // 返回对象 自身、可枚举属性组成的数组

    // Object.preventExtensions() // 让一个对象变成不可扩展的，不能添加新的属性，可以删除，原型上可以添加

    // Object.seal() // 密封一个对象，阻止添加新属性，并将所有现有的属性标记为不可配置，之前的属性可写的就能改，如果所有属性都改成不能写，就变成了冻结

    // Object.setPrototypeOf(obj, prototype) // 为对象设置原型(一个对象 或 null).

    // Object.values() // 返回对象所有可枚举属性的值，组成的数组



    //   const obj = { a: 1 };
    //   // 合并
    //   // Object.assign(obj, { a: 2, c: 3 });
    //   Object.assign(obj, '123', '456');
    //   Object.assign(obj, '123', [111, 222, 333]);
    //   // assign核心=> 对第一个之后的参数，分别变量。逐个添加进第一个参数中，如果已有，就覆盖
    //   console.log(obj)

    // entries、fromEntries
    const map = { a: 1, b: 1, c: 1 };
    const entriesObj = Object.entries(map);
    const fromEntriesObj = Object.fromEntries(entriesObj);
    console.log(entriesObj)
    console.log(fromEntriesObj)
    console.log(fromEntriesObj === map)


    Object.myEntries = function(obj) {
      let _pool = [];
      if (Object.prototype.toString.call(obj) === '[object Object]') {
        for (let i in obj) {
          if (obj.hasOwnProperty(i)) {
            _pool.push([i, obj[i]])
          }
        }
      }
      return _pool;
    }
    Object.myFromEntries = function(Arr) {
      const obj = {};
      for (let i of Arr) {
        obj[i[0]] = i[1]
      }
      return obj;
    }
    const map2 = { a: 1, b: 1, c: 1 };
    const entriesObj2 = Object.myEntries(map2);
    const fromEntriesObj2 = Object.myFromEntries(entriesObj2);
    console.log(entriesObj2)
    console.log(fromEntriesObj2)
    console.log(fromEntriesObj2 === map2)
  </script>
</body>

</html>